package org.example;

import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.ColumnConfig;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.io.Serializable;

public class Codegen {

    public static void main(String[] args) {
        //配置数据源
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");

        //创建配置内容，两种风格都可以。
        GlobalConfig globalConfig = createGlobalConfigUseStyle1();
        //GlobalConfig globalConfig = createGlobalConfigUseStyle2();

        //通过 datasource 和 globalConfig 创建代码生成器
        Generator generator = new Generator(dataSource, globalConfig);

        //生成代码
        generator.generate();
    }

    public static   GlobalConfig createGlobalConfigUseStyle1() {
        // 创建全局配置对象
        GlobalConfig globalConfig = new GlobalConfig();

        // 设置根包名（根据实际项目结构调整）
        globalConfig.setBasePackage("org.example.mybatis");

        // 指定只生成哪些表（明确要生成的表名）
        globalConfig.setGenerateTable("course", "score", "student", "teacher");

        globalConfig.getStrategyConfig()
//                .setTablePrefix("tb_")  //数据库表前缀
        .setLogicDeleteColumn("del_flag")
                .setGenerateForView(true);

        // ==================== Entity 配置 ====================
        globalConfig.setEntityGenerateEnable(true);
        globalConfig.setEntityWithLombok(true);                 // 启用 Lombok 简化实体类
        globalConfig.setEntityJdkVersion(17);                   // 使用 Java 17 的特性（如 var, record 等不启用，仅语法级别）

        globalConfig.getEntityConfig()
                .setOverwriteEnable(true)
                .setImplInterfaces(Serializable.class)
        //                .setClassSuffix("Entity") //添加类名后缀
        ;


        // ==================== Mapper 配置 ====================
        globalConfig.setMapperGenerateEnable(true);
        globalConfig.setMapperXmlGenerateEnable(true);          // 是否生成 XML 文件（推荐开启，便于复杂 SQL 编写）

        // ==================== Service & Controller（可选）====================
        // 如果需要生成 Service 和 Controller 层代码，可以启用以下配置
         globalConfig.setServiceGenerateEnable(true);
         globalConfig.setControllerGenerateEnable(true);

        // ==================== 其他高级配置 ====================

        // 打印生成信息日志
        System.out.println("✅ 代码生成器 GlobalConfig 已配置完成，基础包: " + globalConfig.getBasePackage());

        return globalConfig;
    }

    public static GlobalConfig createGlobalConfigUseStyle2() {
        //创建配置内容
        GlobalConfig globalConfig = new GlobalConfig();

        //设置根包
        globalConfig.getPackageConfig()
                .setBasePackage("com.test");

        //设置表前缀和只生成哪些表，setGenerateTable 未配置时，生成所有表
        globalConfig.getStrategyConfig()
                .setTablePrefix("tb_")
                .setGenerateTable("tb_account", "tb_account_session");

        //设置生成 entity 并启用 Lombok
        globalConfig.enableEntity()
                .setWithLombok(true)
                .setJdkVersion(17);

        //设置生成 mapper
        globalConfig.enableMapper();

        //可以单独配置某个列
        ColumnConfig columnConfig = new ColumnConfig();
        columnConfig.setColumnName("tenant_id");
        columnConfig.setLarge(true);
        columnConfig.setVersion(true);
        globalConfig.getStrategyConfig()
                .setColumnConfig("tb_account", columnConfig);

        return globalConfig;
    }
}